// 这块要求的是最优选法的方案数，并不是恰好的方案数
// 考虑如下：f[i][j]表示在考虑前i个物品的情况下体积不超过j的最大值
// 状态转移方程：f[i][j] = max(f[i - 1][j], f[i - 1][j - v] + w)
// 用g[i][j]表示这种情况下的方案数量//如果f[i][j] == f[i - 1][j]，表示可以加入第一类方案
// 如果f[i][j] = f[i - 1][j - v] + w, 表示可以加入第二种方案
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010, mod = 1e9 + 7;
int f[N], g[N];
int n, m;

int main()
{
    cin >> n >> m;
    // 如果选择使用不超过的方法，那么初始情况下什么都不选是每个的方案
    for (int i = 0; i <= m; ++i)
        g[i] = 1;
    while (n--)
    {
        int v, w;
        cin >> v >> w;
        for (int j = m; j >= v; --j)
        {
            int maxv = max(f[j], f[j - v] + w);
            int cnt = 0;
            if (maxv == f[j])
                cnt = (cnt + g[j]) % mod;
            if (maxv == f[j - v] + w)
                cnt = (cnt + g[j - v]) % mod;
            f[j] = maxv;
            g[j] = cnt;
        }
    }
    cout << g[m] << endl;
    return 0;
}
